package com.zmh.service.wechat;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.util.HtmlUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zmh.common.DateUtil;
import com.zmh.dao.MessageInfoDao;
import com.zmh.model.wechat.httpClient.MessageInfo;
import com.zmh.model.wechat.httpClient.Wimage;
import com.zmh.service.httpclient.WeChat;
import com.zmh.service.timer.WorkNotesTimer;

/** 
 * @author zhoumh
 * @version 创建时间：2017年11月6日 下午7:38:12 
 * @Description 
*/
@Service
public class WeChatService {
	private static Logger logger = LoggerFactory.getLogger(WeChatService.class);
	@Autowired
	private WeChat wechat;
	@Autowired
	private MessageInfoService messageInfoService;
	@Autowired
	private MessageInfoDao messageInfoDao;
	@Autowired
	private WimageService wimageService;
	/**
	 * 查询登录状态，如果未登录则返回登录链接
	 * @return String 登录状态或登录链接
	 * @author zhoumh
	 * @version 创建时间：2018年4月6日 下午8:45:09
	 */
	public String getLogin(){
		String result = "";
		if(!wechat.isLogin()){
			//不在登录状态，获取登录链接
			result = wechat.getQrcode();
		}else{
			result = "当前正在登录状态，无需登陆！";
		}
		return result;
	}
	/**
	 * 获取登陆二维码
	 * @return: String 登陆链接 
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月7日 上午10:40:47 
	 * @Description:
	 */
	public String getQrcode(){
		String result = "";
		result = wechat.getQrcode();
		return result;
	}
	/**
	 * 验证二维码扫码状态并获取token完成登陆
	 * @return 
	 * @return: String
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月9日 上午10:51:41 
	 * @Description:
	 */
	public String checkQrcode(){
		String result = "";
		result= wechat.checkQrcode();
		return result;
	}
	/**
	 * 验证微信公众号是否在登陆状态
	 * @return: boolean true 登陆 false 未登录
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月9日 下午2:23:45 
	 * @Description:
	 */
	public boolean checkLogin(){
		boolean result = false;
		result = wechat.isLogin();
		return result;
	}
	/**
	 * 整点报时，每个整点推送一篇图文消息
	 * @return 
	 * @return: boolean
	 * @author: zhoumh
	 * @version: 创建时间：2017年12月14日 下午2:24:16 
	 * @Description:
	 */
	public boolean punctually() {
		boolean result = false;
		// 微信未登录，停止调用，直接返回
		if (!checkLogin()) {
			logger.info("微信未登录！");
//			return false;
		}
		//获取 100000146 消息内容
		String appMsg = wechat.getAppMsgById("100000146");
		if (StringUtils.isEmpty(appMsg)) {
			logger.error("未获取到消息内容！");
			return false;
		}
		// 获取发送时间距离当前时间最远的一个动图
		Wimage wimage = wimageService.selWimageByOne();
		JSONObject item = JSON.parseArray(appMsg).getJSONObject(0);
		JSONObject multiItem = item.getJSONArray("multi_item").getJSONObject(0);
		String title =  "整点报时："+DateUtil.getDateTime();
		// 获取最后一条消息的发送时间，生成摘要：距离会话结束还有xxx小时
		String digest = "距离会话结束还有"+getHourDiff()+"小时";
		String datasrc = wimage.getWurl();
		// 获取消息内容的HTML代码
		String html = "<div id=\"custom\">"+HtmlUtils.htmlUnescape(multiItem.getString("content"))+"</div>";
		Document doc = Jsoup.parse(html);
		// 使用jsoup替换消息内容
		doc.select("img").attr("data-src",datasrc);
		// 将修改后的内容放入json中
		multiItem.put("title", title);
		multiItem.put("digest", digest);
		multiItem.put("content", doc.select("div#custom").html());
		item.put("multi_item", multiItem);
		logger.info("发送的图文消息：item: "+item.toString());
		// 修改图文消息
		wechat.updAppMsg("["+item.toString()+"]");
		// 发送图文消息
		wechat.sendAppMsg("100000146");
		// 发送成功后修改图片发送时间
		wimage.setSendtime(DateUtil.getDateTime());
		wimageService.updWiamgeByUuid(wimage);
		return result;
		//
	}
	/**
	 * 获取消息列表中的待发送消息进行发送
	 * @return: void
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月22日 下午3:28:43 
	 * @Description:
	 */
	public void sendMessage() {
		// 获取状态为待发送，且时间是当前时间之前的未发送消息列表
		List<MessageInfo> messageInfos = messageInfoDao.selMsgByST("0",DateUtil.getDateTime(),0,10);
		logger.info("获取待发送消息列表，共计： "+messageInfos.size());
		// 待发送消息为0 停止调用，直接返回
		if (messageInfos.size() == 0) {
			return;
		}
		// 微信未登录，停止调用，直接返回
		if (!checkLogin()) {
			logger.info("微信未登录！");
			return;
		}
		// 遍历待发送消息列表进行发送
		for (MessageInfo messageInfo : messageInfos) {
			boolean rs = wechat.sendMessge(messageInfo.getOpenid(), messageInfo.getContent());
			if (rs) {
				//修改发送状态为成功
				messageInfo.setStatus("1");
				if(messageInfoDao.updMsgByUuid(messageInfo)!=1){
					logger.error("消息状态变更失败！ "+messageInfo.getContent());
				}
			}else{
				logger.error("消息发送失败！"+messageInfo.getContent());
			}
		}
	}
	/**
	 * 计算最后一条消息与当前时间的小时差
	 * @author zhoumh
	 * @version 创建时间：2017年12月31日 上午10:53:20
	 */
	private long getHourDiff(){
		long result = 0;
		String[] lastMsg = wechat.getLastMessage();
		if (lastMsg.length == 0) {
			logger.error("未获取到最后更新时间");
		}
		String lastTime = lastMsg[1];
		result = DateUtil.getHourDiff(lastTime+":000");
		logger.info(lastTime+":000");
		return result;
	}
	
	/**
	 * 获取最后一条交互消息的时间，计算与当前时间的时间差生成提醒消息
	 * @return: boolean true 生成提醒消息成功 false 生成消息失败
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月14日 上午10:47:08 
	 * @Description:
	 */
	public boolean checkLastMessageTime(){
		boolean result = false;
		String[] lastMsg = wechat.getLastMessage();
		if (lastMsg.length == 0) {
			logger.error("未获取到最后更新时间");
			return result;
		}
		String lastMsgId = lastMsg[0];
		String lastTime = lastMsg[1];
		// 查询待发消息中是否有该消息ID的待发消息
		int count = messageInfoService.sumMsgByDesc(lastMsgId,"0");
		System.out.println(count);
		if(count>0){
			logger.info("微信最后一条消息ID为："+lastMsgId+" 已存在，消息最后发送时间为: "+lastTime);
			return true;
		}else{
			// 最后一条消息ID没有未发送记录，清空未发送消息里面的最后一条消息类型的
			messageInfoService.delMsgByType("3", "0");
		}
		String content = "提醒：微信上次会话时间为: "+lastTime+" 距离会话超时还有 ";
		//根据小时数进行循环
		for(int i=1;i<=48;i++){
			//从最后一条消息的时间每次循环加一个小时
			lastTime = DateUtil.addHour(lastTime, 1);
			//待发送消息的时间要超过系统当前时间
			if (DateUtil.compareDate(lastTime, DateUtil.getDateTime())>0) {
				// 根据时间生成待发送消息  上次会话时间为: 2017-11-13 17:12:44:000 距离会话超时还有 30 分钟
//				if (i<48) {
//					insertMsg(content+(48-i)+" 小时",lastTime,lastMsgId);
//				}
				if (i==48) {
					//一次性增加三次分钟级别的提醒消息
					insertMsg(content+"30 分钟",DateUtil.subMin(lastTime, 30),lastMsgId);
					insertMsg(content+"10 分钟",DateUtil.subMin(lastTime, 10),lastMsgId);
					insertMsg(content+"5 分钟",DateUtil.subMin(lastTime, 5),lastMsgId);
					insertMsg(content+"1 分钟",DateUtil.subMin(lastTime, 1),lastMsgId);
				}
			}
		}
		return result;
	}
	// 提取消息插入方法
	private void insertMsg(String content,String sendtime,String msgId){
		MessageInfo messageInfo = new MessageInfo();
		// 发送类型 微信公众号
		messageInfo.setSendmode("0");
		// 发送内容
		messageInfo.setContent(content);
		// 发送对象
		messageInfo.setOpenid("oq8Y20dXcYxg4Pk_dI6VVtnLZM0Q");
		// 微信最后一条消息
		messageInfo.setType("3");
		messageInfo.setSendtime(sendtime);
		messageInfo.setDescription(msgId);
		boolean result = messageInfoService.insMsg(messageInfo);
		if (result) {
			logger.info("消息保存成功："+content);
		}else{
			logger.error("消息保存失败："+content);
		}
	}
	
	
}
